package com.wmh.baseservice.robot.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wmh.baseservice.admin.service.AdRoleService;
import com.wmh.baseservice.common.ex.ServiceException;
import com.wmh.baseservice.robot.entity.RobotTaskTemplate;
import com.wmh.baseservice.robot.mapper.RobotTaskTemplateMapper;
import com.wmh.baseservice.robot.pojo.vo.tasktemplate.CopyTaskTemplateReqVO;
import com.wmh.baseservice.robot.service.RobotTaskTemplateService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * @author 20402
 * @description 针对表【robot_task_template】的数据库操作Service实现
 * @createDate 2022-10-31 17:04:28
 */
@Service
public class RobotTaskTemplateServiceImpl extends ServiceImpl<RobotTaskTemplateMapper, RobotTaskTemplate>
        implements RobotTaskTemplateService {

    @Resource
    private AdRoleService adRoleService;

    @Override
    public void commitTaskTemplate(Long adId, Long templateId, String templateName, String configSnapshotList) {

        /* 校验是否存在同名的模板 */
        checkTaskTemplateUniqueName(adId, templateId, templateName);
        RobotTaskTemplate robotTaskTemplate = new RobotTaskTemplate()
                .setAdId(adId.toString()).setName(templateName).setTaskConfigSnapshot(configSnapshotList);
        if (templateId != null) {
            robotTaskTemplate.setId(templateId.toString());
        }
        if (!saveOrUpdate(robotTaskTemplate)) {
            throw new ServiceException("操作失败.系统错误,请重试或联系管理员");
        }
    }

    @Override
    public void copyTaskTemplate(Long adId, CopyTaskTemplateReqVO reqVO) {
        RobotTaskTemplate taskTemplate = getById(reqVO.getOldTemplateId());
        if (taskTemplate == null) {
            throw new ServiceException("目标任务模板不存在");
        }
        /*校验操作他人模板权限*/
        checkOperationOtherTemplate(adId, taskTemplate);
        /*校验操作模板唯一名称*/
        checkTaskTemplateUniqueName(adId, reqVO.getOldTemplateId(), reqVO.getNewTemplateName());
        if (!save(new RobotTaskTemplate().setAdId(adId.toString())
                .setName(reqVO.getNewTemplateName()).setTaskConfigSnapshot(taskTemplate.getTaskConfigSnapshot()))) {
            throw new ServiceException("复制模板失败");
        }
    }

    /**
     * 校验任务模板唯一名称
     *
     * @param adId         管理员id
     * @param templateId   模板id
     * @param templateName 模板名称
     */
    private void checkTaskTemplateUniqueName(Long adId, Long templateId, String templateName) {
        if (getOne(new QueryWrapper<RobotTaskTemplate>()
                .eq(RobotTaskTemplate.NAME, templateName)
                .eq(RobotTaskTemplate.AD_ID, adId)
                .ne(templateId != null, RobotTaskTemplate.ID, templateId)) != null) {
            throw new ServiceException("该模板名称已经存在 ");
        }
    }

    /**
     * 校验管理员是否可以操作其他管理员模板
     *
     * @param adId 用户编号
     */
    private void checkOperationOtherTemplate(Long adId, RobotTaskTemplate taskTemplate) {
        boolean hasSupperAdmin = adRoleService.isHasSupperAdmin(adId);
        // 操作模板不属于当前管理员,并且没有超级管理员权限
        if (!Objects.equals(Long.valueOf(taskTemplate.getAdId()), adId) && !hasSupperAdmin) {
            throw new ServiceException("当前用户没有权限操作他人模板");
        }
    }
}




